package com.kerwin.usersys;


import com.kerwin.annotations.Logs;
import com.kerwin.base.BaseController;
import com.kerwin.config.CrmTokenProperties;
import com.kerwin.entity.returnjson.AxiosResultGenerics;
import com.kerwin.entity.returnjson.E;
import com.kerwin.entity.returnjson.TableDate;
import com.kerwin.exception.HandlerException;
import com.kerwin.sysmgt.UserService;
import com.kerwin.sysmgt.entity.ConditionUser;
import com.kerwin.sysmgt.entity.User;
import com.kerwin.utils.SpringContextUtil;
import com.kerwin.utils.UserThreadLocal;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.util.List;
import java.util.Objects;

/*这个注解是REST风格的 控制层*/
@RestController
/*这个是路径*/
@RequestMapping("/sys/user")
/*在这里继承工具类里面父类 实现自动填入 分页 请求参数*/
/*还有可以少些 一点返回类的代码，没屁用*/
public class UserHandler extends BaseController {

    @Resource
    public UserService userService;

    public Logger l = LoggerFactory.getLogger(UserHandler.class);

    /*找到bug了，这里依赖的注解是commons里面的注解*/
    @Logs(module="用户管理",operate="查询单个用户")
    @GetMapping("{id}")
    public void getForId(@PathVariable String id){
        User byId = userService.getById(id);

        System.out.println(byId);
    }


    /*前端传一个json对象过来*/
    /*里面有用户名和密码*/
    @Logs(module="用户管理",operate="用户登录")
    @PostMapping("/login")
    public ResponseEntity userLogin(@RequestBody User user) throws HandlerException {
        System.out.println("进入了用户登录方法");
        User selectUser = userService.userLogin(user.getUserName(), user.getUserPassword());
        if(Objects.isNull(selectUser)){
            l.error("用户名或密码错误");
            /*全局异常*/
            /*用户名或密码错误*/
            /*这里返回的应该不是null，而是封装起来的AxiosResult对象*/
            /*！！这个是我抛出去的自定义异常，所以，没有原生的错误信息，只有我自己定义的信息！！*/
            throw new HandlerException(E.LOGIN_FAIL);

            /*手动抛出异常，下面的语句不会执行*/
        }else {
            /*从配置文件拿到头文件*/
            String headerName = SpringContextUtil.getBean(CrmTokenProperties.class).getHeaderName();
            /*System.out.println(1/0);*/

            String token = userService.setToken(user.getUserName());
            /*token不应该是直接返回的，而是放在请求头里*/
            /*请求头居然是直接new出来的？？*/
            HttpHeaders httpHeaders = new HttpHeaders();

            httpHeaders.add(headerName,token);

            //从数据库把用户查出来

            /*把登录用户放到 用户线程变量里面*/
            UserThreadLocal.setUser(selectUser);
            int a=1;
            /*返回的这个东西包含请求头，就很imba*/
            return new ResponseEntity(suc(E.SUC, token),httpHeaders, HttpStatus.OK);

        }

    }

    @Logs(module="用户管理",operate="查询用户列表")
    /*写一个带分页的查询用户list的方法*/
    @PostMapping("/select")
    public AxiosResultGenerics<TableDate> getUserList(@RequestBody ConditionUser conditionUser){
        System.out.println("进入了select方法吗");
        List<User> userList=null;
        /*这个分页参数是从前端传过来的，封在Servlet 和 BaseController 方法里面了*/
        /*但是这个是post条件查询请求，老师封的 只有默认值有用了*/
        /*因为我不用get发请求参数*/
            startPage(conditionUser.getPageNum(), conditionUser.getPageSize());
            userList= userService.getUserList(conditionUser);



        return AxiosResultGenerics.SUC(E.SUC, userList);

    }

    /*添加用户*/
    @PostMapping("/add")
    public void addUser(@RequestBody User user){
        userService.addUser(user);
    }

}
